24169
8865
أقوم حاليًا بكتابة محلل أساسي لنكهة XML. كتمرين ، أقوم بتطبيق محلل LL يحركه الجدول.
هذا هو مثالي لقواعد BNF:
٪ سلسلة بيانات اسم الرمز المميز
٪٪ / * LL (1) * /
doc: إليم
إليم: "<" open_tag
open_tag: اسم attr close_tag
close_tag: ">" elem_or_data ""
| "/>"
؛
elem_or_data: "<" open_tag elem_or_data
| البيانات elem_or_data
| / * إبسيلون * /
؛
attr: الاسم ":" Attr
| / * إبسيلون * /
؛
هل هذا النحو صحيح؟
كل محطة حرفية بين الاقتباسات. يتم تحديد المحطات الطرفية المجردة بواسطة٪ token.
أقوم بترميز lexer مكتوب بخط اليد لتحويل مدخلاتي إلى قائمة الرموز المميزة. كيف يمكنني ترميز المحطات المجردة؟ 
تتمثل الطريقة التقليدية في كتابة تعبير عادي (أو أداة تمييز أخرى) لكل طرف محتمل.
ما تسميه محطات "مجردة" ، وهي ملموسة تمامًا ، هي في الواقع محطات طرفية تتعرف أنماطها المرتبطة على أكثر من سلسلة إدخال محتملة. يجب تمرير السلسلة التي تم التعرف عليها بالفعل (أو بعض الوظائف المحسوبة لتلك السلسلة) إلى المحلل اللغوي كقيمة دلالية للرمز المميز.
اسميًا ، في كل نقطة في سلسلة الإدخال ، سيعمل الرمز المميز على تشغيل جميع أدوات التعرف ويختار الشخص الذي يحتوي على أطول تطابق. (هذا هو ما يسمى بقاعدة "munch القصوى".) يمكن عادةً تحسين ذلك ، خاصةً إذا كانت جميع الأنماط عبارة عن تعبيرات عادية. (و) سيقوم lex بهذا التحسين نيابة عنك ، على سبيل المثال.
من المضاعفات في حالتك أن ترميز لغتك يعتمد على السياق. على وجه الخصوص ، عندما يكون الهدف هو elem_or_data ، فإن الرموز المميزة الوحيدة الممكنة هي <و